import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 邓大帅
 * Date: 2024-01-22
 * Time: 20:18
 */
//池的概念就是提前申请资源存储在池中，要用的时候可以随用随取无需等待 本质上就是空间换时间
public class JDBCInsert {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
//        JDBC 需要通过以下步骤来完成开发
//        1.创建并初始化一个数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//URL：唯一资源定位符 用于描述网络上某个资源所在的位置
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");
//        2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
//        3.从控制台读取用户的输入内容
        System.out.println("请输入学生姓名：");
        String name = scanner.nextLine();
        System.out.println("请输入学号：");
        int id = scanner.nextInt();
//        4.构造 SQL 语句
//        String sql = "insert into student values (" + id + ", '" + name + "')";这种写法丑，可读性低，容易有sql注入的风险 网络安全中的典型攻击方式
//        通常使用PreparedStatement的拼装功能来实现
        String sql = "insert into student values (?,?);";//？为占位符
        PreparedStatement statement = connection.prepareStatement(sql);//使用preparedStatement预编译一下sql
        statement.setInt(1,id);//设置第一个占位符
        statement.setString(2,name);//设置第二个占位符
//        这个打印需要加到拼接数据以后，打印statement可以方便查看sql是否错误
        System.out.println(statement);
//        5.执行 SQL 语句
        int ret = statement.executeUpdate();//insert、update、delete语句都可以用executeUpdate方法执行 select用executeQuery方法执行 返回int表示影响的行数
        System.out.println("ret = " + ret);
//        6.释放必要的资源
//        先创建的后释放
        statement.close();
        connection.close();
    }
}
